* Europos centrinio banko duomenų portalas: https://data.ecb.europa.eu/
* Trading View: https://www.tradingview.com/symbols/TVC-SXXP/
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX
euribor = pd.read_csv("C:\Baigiamasis darbas\ECB euribor data.csv")
loans = pd.read_excel("C:\Baigiamasis darbas\ECB Loans cost exe.xlsx")
property = pd.read_excel("C:\Baigiamasis darbas\ECB Residential property prices by country exe.xlsx")
rental = pd.read_excel("C:\\Baigiamasis darbas\\ECB rentals for housing by country exe.xlsx")
index = pd.read_excel("C:\Baigiamasis darbas\Europe 600 Index exe.xlsx")
euribor
date | time_period | euribor_3_month | |
---|---|---|---|
0 | 1994-01-31 | 1994Jan | 6.9100 |
1 | 1994-02-28 | 1994Feb | 6.8600 |
2 | 1994-03-31 | 1994Mar | 6.7500 |
3 | 1994-04-30 | 1994Apr | 6.5700 |
4 | 1994-05-31 | 1994May | 6.2400 |
... | ... | ... | ... |
353 | 2023-06-30 | 2023Jun | 3.5359 |
354 | 2023-07-31 | 2023Jul | 3.6718 |
355 | 2023-08-31 | 2023Aug | 3.7803 |
356 | 2023-09-30 | 2023Sep | 3.8800 |
357 | 2023-10-31 | 2023Oct | 3.9676 |
358 rows × 3 columns
loans
date | obs_value | series_key | |
---|---|---|---|
0 | 2003-01-31 | 4.96 | MIR.M.AT.B.A2C.AM.R.A.2250.EUR.N |
1 | 2003-02-28 | 4.85 | MIR.M.AT.B.A2C.AM.R.A.2250.EUR.N |
2 | 2003-03-31 | 4.80 | MIR.M.AT.B.A2C.AM.R.A.2250.EUR.N |
3 | 2003-04-30 | 4.48 | MIR.M.AT.B.A2C.AM.R.A.2250.EUR.N |
4 | 2003-05-31 | 4.36 | MIR.M.AT.B.A2C.AM.R.A.2250.EUR.N |
... | ... | ... | ... |
4255 | 2023-05-31 | 3.78 | MIR.M.SK.B.A2C.AM.R.A.2250.EUR.N |
4256 | 2023-06-30 | 3.92 | MIR.M.SK.B.A2C.AM.R.A.2250.EUR.N |
4257 | 2023-07-31 | 3.91 | MIR.M.SK.B.A2C.AM.R.A.2250.EUR.N |
4258 | 2023-08-31 | 3.94 | MIR.M.SK.B.A2C.AM.R.A.2250.EUR.N |
4259 | 2023-09-30 | 3.92 | MIR.M.SK.B.A2C.AM.R.A.2250.EUR.N |
4260 rows × 3 columns
property
date | obs_value | series_key | |
---|---|---|---|
0 | 2000-03-31 | 60.81 | RESR.Q.AT._T.N._TR.TVAL.4F0.TB.N.IX |
1 | 2000-06-30 | 59.79 | RESR.Q.AT._T.N._TR.TVAL.4F0.TB.N.IX |
2 | 2000-09-30 | 58.78 | RESR.Q.AT._T.N._TR.TVAL.4F0.TB.N.IX |
3 | 2000-12-31 | 58.60 | RESR.Q.AT._T.N._TR.TVAL.4F0.TB.N.IX |
4 | 2001-03-31 | 61.46 | RESR.Q.AT._T.N._TR.TVAL.4F0.TB.N.IX |
... | ... | ... | ... |
2426 | 2022-06-30 | 175.62 | RESR.Q.SK._T.N._TR.TVAL.4D0.TB.N.IX |
2427 | 2022-09-30 | 180.61 | RESR.Q.SK._T.N._TR.TVAL.4D0.TB.N.IX |
2428 | 2022-12-31 | 179.18 | RESR.Q.SK._T.N._TR.TVAL.4D0.TB.N.IX |
2429 | 2023-03-31 | 179.19 | RESR.Q.SK._T.N._TR.TVAL.4D0.TB.N.IX |
2430 | 2023-06-30 | 172.26 | RESR.Q.SK._T.N._TR.TVAL.4D0.TB.N.IX |
2431 rows × 3 columns
rental
date | obs_value | series_key | |
---|---|---|---|
0 | 2015-12-31 | 100.00 | ICP.M.AL.N.041000.4.INX |
1 | 2016-01-31 | 100.00 | ICP.M.AL.N.041000.4.INX |
2 | 2016-02-29 | 100.00 | ICP.M.AL.N.041000.4.INX |
3 | 2016-03-31 | 100.00 | ICP.M.AL.N.041000.4.INX |
4 | 2016-04-30 | 100.00 | ICP.M.AL.N.041000.4.INX |
... | ... | ... | ... |
8835 | 2023-05-31 | 113.03 | ICP.M.SK.N.041000.4.INX |
8836 | 2023-06-30 | 113.52 | ICP.M.SK.N.041000.4.INX |
8837 | 2023-07-31 | 113.78 | ICP.M.SK.N.041000.4.INX |
8838 | 2023-08-31 | 115.06 | ICP.M.SK.N.041000.4.INX |
8839 | 2023-09-30 | 114.97 | ICP.M.SK.N.041000.4.INX |
8840 rows × 3 columns
index
date | Open | High | Low | Close | |
---|---|---|---|---|---|
0 | 2023-11-30 | 434.71 | 445.89 | 433.33 | 442.81 |
1 | 2023-10-31 | 450.82 | 457.02 | 428.84 | 433.66 |
2 | 2023-09-30 | 458.31 | 465.32 | 444.38 | 450.22 |
3 | 2023-08-31 | 470.95 | 471.19 | 445.50 | 458.19 |
4 | 2023-07-31 | 461.89 | 472.69 | 444.91 | 471.35 |
... | ... | ... | ... | ... | ... |
354 | 1994-05-31 | 134.92 | 134.92 | 127.77 | 127.77 |
355 | 1994-04-30 | 131.37 | 135.85 | 131.02 | 134.74 |
356 | 1994-03-31 | 135.49 | 137.40 | 130.82 | 130.82 |
357 | 1994-02-28 | 143.87 | 144.68 | 135.94 | 136.98 |
358 | 1994-01-31 | 138.48 | 144.44 | 137.99 | 144.44 |
359 rows × 5 columns
euribor.rename(columns={' euribor_3_month': 'euribor_3_month'}, inplace=True)
country_mapping = {
'AT': 'Austria',
'BE': 'Belgium',
'CY': 'Cyprus',
'CZ': 'Czech Republic',
'HR': 'Croatia',
'HU': 'Hungary',
'DK': 'Denmark',
'LT': 'Lithuania',
'LU': 'Luxembourg',
'LV': 'Latvia',
'DE': 'Germany',
'EE': 'Estonia',
'ES': 'Spain',
'FI': 'Finland',
'FR': 'France',
'GR': 'Greece',
'IE': 'Ireland',
'IT': 'Italy',
'MT': 'Malta',
'NL': 'Netherlands',
'PT': 'Portugal',
'PL': 'Poland',
'RO': 'Romania',
'SI': 'Slovenia',
'SK': 'Slovakia',
'SE': 'Sweden'
}
def replace_country_code(text):
for code, name in country_mapping.items():
if code in text:
return name
return text
loans['series_key'] = loans['series_key'].apply(replace_country_code)
loans.rename(columns={'series_key': 'country'}, inplace=True)
loans
date | obs_value | country | |
---|---|---|---|
0 | 2003-01-31 | 4.96 | Austria |
1 | 2003-02-28 | 4.85 | Austria |
2 | 2003-03-31 | 4.80 | Austria |
3 | 2003-04-30 | 4.48 | Austria |
4 | 2003-05-31 | 4.36 | Austria |
... | ... | ... | ... |
4255 | 2023-05-31 | 3.78 | Slovakia |
4256 | 2023-06-30 | 3.92 | Slovakia |
4257 | 2023-07-31 | 3.91 | Slovakia |
4258 | 2023-08-31 | 3.94 | Slovakia |
4259 | 2023-09-30 | 3.92 | Slovakia |
4260 rows × 3 columns
country_mapping = {
'AT': 'Austria',
'BE': 'Belgium',
'CY': 'Cyprus',
'CZ': 'Czech Republic',
'HR': 'Croatia',
'HU': 'Hungary',
'DK': 'Denmark',
'LT': 'Lithuania',
'LU': 'Luxembourg',
'LV': 'Latvia',
'DE': 'Germany',
'EE': 'Estonia',
'ES': 'Spain',
'FI': 'Finland',
'FR': 'France',
'GR': 'Greece',
'IE': 'Ireland',
'IT': 'Italy',
'MT': 'Malta',
'NL': 'Netherlands',
'PT': 'Portugal',
'PL': 'Poland',
'RO': 'Romania',
'SI': 'Slovenia',
'SK': 'Slovakia',
'SE': 'Sweden'
}
def replace_country_code(text):
for code, name in country_mapping.items():
if code in text:
return name
return text
property['series_key'] = property['series_key'].apply(replace_country_code)
property.rename(columns={'series_key': 'country'}, inplace=True)
property
date | obs_value | country | |
---|---|---|---|
0 | 2000-03-31 | 60.81 | Austria |
1 | 2000-06-30 | 59.79 | Austria |
2 | 2000-09-30 | 58.78 | Austria |
3 | 2000-12-31 | 58.60 | Austria |
4 | 2001-03-31 | 61.46 | Austria |
... | ... | ... | ... |
2426 | 2022-06-30 | 175.62 | Spain |
2427 | 2022-09-30 | 180.61 | Spain |
2428 | 2022-12-31 | 179.18 | Spain |
2429 | 2023-03-31 | 179.19 | Spain |
2430 | 2023-06-30 | 172.26 | Spain |
2431 rows × 3 columns
country_mapping = {
'AL': 'Albania',
'AT': 'Austria',
'BE': 'Belgium',
'BG': 'Bulgaria',
'GB': 'United Kingdom',
'CY': 'Cyprus',
'CZ': 'Czech Republic',
'HR': 'Croatia',
'HU': 'Hungary',
'DK': 'Denmark',
'LT': 'Lithuania',
'LU': 'Luxembourg',
'LV': 'Latvia',
'DE': 'Germany',
'EE': 'Estonia',
'ES': 'Spain',
'FI': 'Finland',
'FR': 'France',
'GR': 'Greece',
'IE': 'Ireland',
'IT': 'Italy',
'MT': 'Malta',
'NL': 'Netherlands',
'PT': 'Portugal',
'PL': 'Poland',
'RO': 'Romania',
'SI': 'Slovenia',
'SK': 'Slovakia',
'SE': 'Sweden'
}
def replace_country_code(text):
for code, name in country_mapping.items():
if code in text:
return name
return text
rental['series_key'] = rental['series_key'].apply(replace_country_code)
rental.rename(columns={'series_key': 'country'}, inplace=True)
rental
date | obs_value | country | |
---|---|---|---|
0 | 2015-12-31 | 100.00 | Albania |
1 | 2016-01-31 | 100.00 | Albania |
2 | 2016-02-29 | 100.00 | Albania |
3 | 2016-03-31 | 100.00 | Albania |
4 | 2016-04-30 | 100.00 | Albania |
... | ... | ... | ... |
8835 | 2023-05-31 | 113.03 | Slovakia |
8836 | 2023-06-30 | 113.52 | Slovakia |
8837 | 2023-07-31 | 113.78 | Slovakia |
8838 | 2023-08-31 | 115.06 | Slovakia |
8839 | 2023-09-30 | 114.97 | Slovakia |
8840 rows × 3 columns
euribor['date'] = pd.to_datetime(euribor['date'])
loans['date'] = pd.to_datetime(loans['date'])
property['date'] = pd.to_datetime(property['date'])
rental['date'] = pd.to_datetime(property['date'])
index['date'] = pd.to_datetime(index['date'])
loans.rename(columns={'obs_value': 'loans_obs_value'}, inplace=True)
property.rename(columns={'obs_value': 'property_obs_value'}, inplace=True)
rental.rename(columns={'obs_value': 'rental_obs_value'}, inplace=True)
euribor.to_csv('euribor_pakoreguotas_naujas.csv', index=False)
loans.to_excel('loans_pakoreguotas_naujas.xlsx', index=False)
rental.to_excel('rental_pakoreguotas_naujas.xlsx', index=False)
property.to_excel('property_pakoreguotas_naujas.xlsx', index=False)
index.to_excel('index_pakoreguotas_naujas.xlsx', index=False)
merged_data = pd.merge(euribor, loans, on='date', how='inner')
correlation = merged_data['euribor_3_month'].corr(merged_data['loans_obs_value'])
print(f"Koreliacijos koeficientas su paskolų palūkanų norma: {correlation}")
Koreliacijos koeficientas su paskolų palūkanų norma: 0.8018228119497622
data = merged_data[['euribor_3_month', 'loans_obs_value']]
plt.figure(figsize=(10, 6))
plot_acf(data['euribor_3_month'], lags=50)
plt.title('Cross-correlation tarp euribor ir paskolų palūkanų')
plt.xlabel('Lag')
plt.ylabel('Correlation')
plt.show()
<Figure size 1000x600 with 0 Axes>
merged_data = pd.merge(euribor, property, on='date', how='inner')
correlation = merged_data['euribor_3_month'].corr(merged_data['property_obs_value'])
print(f"Koreliacijos koeficientas su nekilnojamojo turto kaina: {correlation}")
Koreliacijos koeficientas su nekilnojamojo turto kaina: -0.3816087917831894
data = merged_data[['euribor_3_month', 'property_obs_value']]
plt.figure(figsize=(10, 6))
plot_acf(data['euribor_3_month'], lags=50)
plt.title('Cross-correlation tarp euribor ir nekilnojamojo turto kainos')
plt.xlabel('Lag')
plt.ylabel('Correlation')
plt.show()
<Figure size 1000x600 with 0 Axes>
merged_data = pd.merge(euribor, rental, on='date', how='inner')
correlation = merged_data['euribor_3_month'].corr(merged_data['rental_obs_value'])
print(f"Koreliacijos koeficientas su nuomos kaina: {correlation}")
Koreliacijos koeficientas su nuomos kaina: 0.012681742253834007
data = merged_data[['euribor_3_month', 'rental_obs_value']]
plt.figure(figsize=(10, 6))
plot_acf(data['euribor_3_month'], lags=50)
plt.title('Cross-correlation tarp euribor ir būsto nuomos kainos')
plt.xlabel('Lag')
plt.ylabel('Correlation')
plt.show()
<Figure size 1000x600 with 0 Axes>
merged_data = pd.merge(euribor, index, on='date', how='inner')
correlation = merged_data['euribor_3_month'].corr(merged_data['Close'])
print(f"Koreliacijos koeficientas su akcijų indeksu: {correlation}")
Koreliacijos koeficientas su akcijų indeksu: -0.5687010893226756
Paskolos (0.8018): Teigiama koreliacija rodo, kad didėjant Euribor, didėja ir paskolų palūkanos. Tai gali būti pagrįsta tuo, kad dauguma paskolų palūkanų yra susietos su šiuo referentiniu rodikliu.
Nekilnojamojo turto kaina (-0.3816): Neigiamas koreliacijos koeficientas rodo, kad didėjant Euribor, mažėja nekilnojamojo turto kaina. Tai gali būti paaiškinama tuo, kad aukštos palūkanos gali sumažinti žmonių galimybes įsigyti būstą ir, taip sumažėjus paklausai, kaina mažėja.
Nuomos kaina (-0.6266): Taip pat pastebime neigiamą koreliaciją su nuomos kaina. Tai gali reikšti, kad didėjant Euribor, mažėja ir nuomos kainos, nes žmonės galbūt daugiau linkę pirkti nei nuomotis dėl didesnių palūkanų.
Akcijų indeksas (nan): "nan" reiškia, kad tarp Euribor ir akcijų indekso nėra statistiškai reikšmingo koreliacijos ryšio. Gali būti, kad šie duomenys yra nepriklausomi vienas nuo kito arba kad yra kitų veiksnių, įtakojančių akcijų indeksą.
Kaip galbūt kis Euribor rodiklis ir nekilnojamojo turto kainos per artimiausius du metus?
model = ARIMA(euribor['euribor_3_month'], order=(1, 1, 1))
model_fit = model.fit()
forecast_steps = 24
forecast = model_fit.get_forecast(steps=forecast_steps)
forecast_index = pd.date_range(start=euribor['date'].max(), periods=forecast_steps + 1, freq='M')[1:]
forecast_values = forecast.predicted_mean
plt.figure(figsize=(10, 6))
plt.plot(euribor['date'], euribor['euribor_3_month'], label='Euribor')
plt.plot(forecast_index, forecast_values, label='Euribor Forecast', linestyle='dashed')
plt.title('Euribor Rate Forecast')
plt.xlabel('Date')
plt.ylabel('Euribor Rate')
plt.legend()
plt.show()
merged_data = pd.merge(euribor, property, on='date', how='inner')
data_for_model = merged_data[['date', 'euribor_3_month', 'property_obs_value']]
data_for_model.set_index('date', inplace=True)
train_size = int(len(data_for_model) * 0.8)
train, test = data_for_model[:train_size], data_for_model[train_size:]
order = (1, 1, 1)
seasonal_order = (1, 1, 1, 12)
model = SARIMAX(data_for_model['property_obs_value'].astype(float), order=order, seasonal_order=seasonal_order, enforce_stationarity=False)
fit_model = model.fit()
forecast_end_date = pd.to_datetime('2025-12-01')
forecast_horizon = (forecast_end_date - test.index[-1]).days // 30
forecasts = fit_model.get_forecast(steps=forecast_horizon)
plt.figure(figsize=(15, 6))
plt.plot(train['property_obs_value'], label='Train')
plt.plot(test.index, test['property_obs_value'], label='Test')
plt.plot(pd.date_range(start=test.index[-1], periods=forecast_horizon + 1, freq='M')[1:], forecasts.predicted_mean, label='Forecast', color='green')
plt.title('SARIMA Forecast for Property Prices')
plt.xlabel('Date')
plt.ylabel('Property Value')
plt.legend()
plt.show()
C:\Users\User\anaconda3\Lib\site-packages\statsmodels\tsa\base\tsa_model.py:473: ValueWarning: A date index has been provided, but it has no associated frequency information and so will be ignored when e.g. forecasting. self._init_dates(dates, freq) C:\Users\User\anaconda3\Lib\site-packages\statsmodels\tsa\base\tsa_model.py:473: ValueWarning: A date index has been provided, but it has no associated frequency information and so will be ignored when e.g. forecasting. self._init_dates(dates, freq) C:\Users\User\anaconda3\Lib\site-packages\statsmodels\tsa\base\tsa_model.py:836: ValueWarning: No supported index is available. Prediction results will be given with an integer index beginning at `start`. return get_prediction_index( C:\Users\User\anaconda3\Lib\site-packages\statsmodels\tsa\base\tsa_model.py:836: FutureWarning: No supported index is available. In the next version, calling this method in a model without a supported index will result in an exception. return get_prediction_index(
Kurioje šalyje pirkti būstą pigiausia/brangiausia?
average_prices = property.groupby('country')['property_obs_value'].mean()
max_price_country = average_prices.idxmax()
max_price_value = average_prices.max()
min_price_country = average_prices.idxmin()
min_price_value = average_prices.min()
print(f"Šalis su didžiausia būsto kaina: {max_price_country} (vidutinė kaina: {max_price_value})")
print(f"Šalis su mažiausia būsto kaina: {min_price_country} (vidutinė kaina: {min_price_value})")
Šalis su didžiausia būsto kaina: Hungary (vidutinė kaina: 131.52712121212122) Šalis su mažiausia būsto kaina: Belgium (vidutinė kaina: 54.87559405940594)
Kurioje šalyje nomuotis būstą pigiausia/brangiausia?
average_prices = rental.groupby('country')['rental_obs_value'].mean()
max_price_country = average_prices.idxmax()
max_price_value = average_prices.max()
min_price_country = average_prices.idxmin()
min_price_value = average_prices.min()
print(f"Šalis su didžiausia būsto nuomos kaina: {max_price_country} (vidutinė kaina: {max_price_value})")
print(f"Šalis su mažiausia būsto nuomos kaina: {min_price_country} (vidutinė kaina: {min_price_value})")
Šalis su didžiausia būsto nuomos kaina: Albania (vidutinė kaina: 104.92) Šalis su mažiausia būsto nuomos kaina: Lithuania (vidutinė kaina: 73.93432432432432)
Kurioje šalyje palūkanų normos yra mažiausios/didžiausios?
average_interests = loans.groupby('country')['loans_obs_value'].mean()
max_interest_country = average_interests.idxmax()
max_interest_value = average_interests.max()
min_interest_country = average_interests.idxmin()
min_interest_value = average_interests.min()
print(f"Šalis su didžiausia paskolų palūkanų norma: {max_interest_country} (vidutinė norma: {max_interest_value})")
print(f"Šalis su mažiausia paskolų palūkanų norma: {min_interest_country} (vidutinė norma: {min_interest_value})")
Šalis su didžiausia paskolų palūkanų norma: Cyprus (vidutinė norma: 3.768095238095238) Šalis su mažiausia paskolų palūkanų norma: Finland (vidutinė norma: 2.27136546184739)
Kur 2023 metais nekilnojamojo turto kainos buvo mažiausios/didžiausios?
year_2023_data = property[property['date'].dt.year == 2023]
sorted_data = year_2023_data.sort_values(by='property_obs_value')
cheapest_country = sorted_data.iloc[0]['country']
cheapest_price = sorted_data.iloc[0]['property_obs_value']
expensive_country = sorted_data.iloc[-1]['country']
expensive_price = sorted_data.iloc[-1]['property_obs_value']
print(f"Pigiausia šalis 2023 m.: {cheapest_country} (kaina: {cheapest_price})")
print(f"Brangiausia šalis 2023 m.: {expensive_country} (kaina: {expensive_price})")
Pigiausia šalis 2023 m.: Spain (kaina: 106.52) Brangiausia šalis 2023 m.: Hungary (kaina: 266.92)
Kur 2023 metais nekilnojamojo turto nuomos kainos buvo mažiausios/didžiausios?
year_2023_data = rental[rental['date'].dt.year == 2023]
sorted_data = year_2023_data.sort_values(by='rental_obs_value')
cheapest_country = sorted_data.iloc[0]['country']
cheapest_price = sorted_data.iloc[0]['rental_obs_value']
expensive_country = sorted_data.iloc[-1]['country']
expensive_price = sorted_data.iloc[-1]['rental_obs_value']
print(f"Pigiausia šalis 2023 m. išsinomuoti būstą: {cheapest_country} (kaina: {cheapest_price})")
print(f"Brangiausia šalis 2023 m. išsinomuoti būstą: {expensive_country} (kaina: {expensive_price})")
Pigiausia šalis 2023 m. išsinomuoti būstą: Estonia (kaina: 49.54) Brangiausia šalis 2023 m. išsinomuoti būstą: Cyprus (kaina: 114.86)
Koks euribor rodiklis ir kuriais metais buvo didžiausias/mažiausias?
sorted_data = euribor.sort_values(by='euribor_3_month')
min_euribor = sorted_data.iloc[0]['euribor_3_month']
min_year = sorted_data.iloc[0]['date'].year
max_euribor = sorted_data.iloc[-1]['euribor_3_month']
max_year = sorted_data.iloc[-1]['date'].year
print(f"Mažiausias euribor rodiklis buvo {min_euribor} ir buvo užfiksuotas {min_year} metais.")
print(f"Didžiausias euribor rodiklis buvo {max_euribor} ir buvo užfiksuotas {max_year} metais.")
Mažiausias euribor rodiklis buvo -0.582 ir buvo užfiksuotas 2021 metais. Didžiausias euribor rodiklis buvo 7.58 ir buvo užfiksuotas 1995 metais.
Kuriais metais ir kokiose šalyse buvo fiksuotos didžiausios/mažiausios palūkanų normos?
sorted_data = loans.sort_values(by='loans_obs_value')
min_interest_rate = sorted_data.iloc[0]['loans_obs_value']
min_country = sorted_data.iloc[0]['country']
min_year = sorted_data.iloc[0]['date'].year
max_interest_rate = sorted_data.iloc[-1]['loans_obs_value']
max_country = sorted_data.iloc[-1]['country']
max_year = sorted_data.iloc[-1]['date'].year
print(f"Mažiausias paskolų palūkanų rodiklis buvo {min_interest_rate}% ir buvo užfiksuotas {min_year} metais šalyje {min_country}.")
print(f"Didžiausias paskolų palūkanų rodiklis buvo {max_interest_rate}% ir buvo užfiksuotas {max_year} metais šalyje {max_country}.")
Mažiausias paskolų palūkanų rodiklis buvo 0.72% ir buvo užfiksuotas 2021 metais šalyje Finland. Didžiausias paskolų palūkanų rodiklis buvo 7.27% ir buvo užfiksuotas 2008 metais šalyje Slovenia.
Kuriose penkiose šalyse 2023 metais buvo mažiausios palūkanos?
loans_2023 = loans[loans['date'].dt.year == 2023]
average_interest_rates = loans_2023.groupby('country')['loans_obs_value'].mean()
sorted_countries = average_interest_rates.sort_values()
top_countries = sorted_countries.head(5)
print("Penkios šalys su mažiausiomis vidutinėmis palūkanomis 2023 metais:")
print(top_countries)
Penkios šalys su mažiausiomis vidutinėmis palūkanomis 2023 metais: country Malta 2.225556 France 2.838889 Croatia 3.117778 Belgium 3.513333 Spain 3.641111 Name: loans_obs_value, dtype: float64